<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>实际使用中的一些建议 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/parent-child-performance.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/parent-child-performance.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child-performance.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child-performance.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="modeling-your-data.html">数据建模</a></span>
»
<span class="breadcrumb-link"><a href="parent-child.html">父-子关系文档</a></span>
»
<span class="breadcrumb-node">实际使用中的一些建议</span>
</div>
<div class="navheader">
<span class="prev">
<a href="grandparents.html">« 祖辈与孙辈关系</a>
</span>
<span class="next">
<a href="scale.html">扩容设计 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="parent-child-performance"></a>实际使用中的一些建议<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/404_Parent_Child/70_Practical_considerations.asciidoc">edit</a>
</h2>
</div></div></div>
<p>当文档索引性能远比查询性能重要的时候，父-子关系是非常有用的，但是它也是有巨大代价的：<em>父-子查询速度会比等效的嵌套查询慢5到10倍</em>!</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_全局序号和延迟"></a>全局序号和延迟 (Global Ordinals and Latency)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/404_Parent_Child/70_Practical_considerations.asciidoc">edit</a>
</h3>
</div></div></div>
<p>父子关系使用了<a class="xref" href="preload-fielddata.html#global-ordinals" title="全局序号（Global Ordinals）">全局序号</a>来加速文档间的联合。不管父子关系映射是否使用了内存缓存或基于硬盘的<code class="literal">doc values</code>，当索引变更时，全局序号要重建。</p>
<p>一个分片中父文档越多，那么全局序号的重建就需要更多的时间。父子关系更适合于父文档少、子文档多的情况。</p>
<p>全局序号默认情况下是延迟构建的：在<code class="literal">refresh</code>后的第一个父子查询会触发全局序号的构建。而这个构建会导致用户使用时感受到明显的延迟。你可以使用<a class="xref" href="preload-fielddata.html#eager-global-ordinals" title="全局序号预加载（Eager global ordinals）">全局序号预加载(Eager global ordinals)</a>来将全局序号构建的开销由<b>查询</b>阶段转移到<code class="literal">refresh</code>阶段，通过如下方式映射<code class="literal">_parent</code>字段：</p>
<div class="pre_wrapper lang-json">
<pre class="programlisting prettyprint lang-json">PUT /company
{
  "mappings": {
    "branch": {},
    "employee": {
      "_parent": {
        "type": "branch",
        "fielddata": {
          "loading": "eager_global_ordinals" <a id="CO285-1"></a><i class="conum" data-value="1"></i>
        }
      }
    }
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO285-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>在一个新的段(segment)可搜索前，<code class="literal">_parent</code>字段的全局序号会被构建。</p>
</td>
</tr>
</table>
</div>
<p>当父文档过多时，全局序号的构建可能需要几秒钟时间。在这种情况下，增加<code class="literal">refresh_interval</code>是有意义的，这样刷新(refresh)的次数就少了，全局序号的有效期也就更长了。这将大大降低每秒重建全局序号的cpu消耗。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_多代使用和结语"></a>多代(Multigenerations)和结束语<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/404_Parent_Child/70_Practical_considerations.asciidoc">edit</a>
</h3>
</div></div></div>
<p>多代文档的关联查询(查看<a class="xref" href="grandparents.html" title="祖辈与孙辈关系">祖辈与孙辈关系</a>)虽然看起来很吸引人，但必须考虑如下的代价：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
关联越多，性能越差。
</li>
<li class="listitem">
每一代的父文档都要将其字符串类型的<code class="literal">_id</code>字段存储在内存中，这会占用大量内存。
</li>
</ul>
</div>
<p>当你考虑父子关系是否适合你现有关系模型时，请考虑下面这些建议：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
尽量少地使用父子关系，仅在子文档远多于父文档时使用。
</li>
<li class="listitem">
避免在单个查询中使用多个父子关联语句。
</li>
<li class="listitem">
避免在<code class="literal">has_child</code>过滤中计算得分，通过设置<code class="literal">has_child</code>查询的<code class="literal">score_mode</code>为<code class="literal">none</code>不再计算得分。
<br/><span style="color:#666;">(原文: Avoid scoring by using the has_child filter, or the has_child query with score_mode set to none.</span>)
</li>
<li class="listitem">
保证父 ID 尽量短，以便在 doc values 中更好地压缩，被临时载入时占用更少的内存。
</li>
</ul>
</div>
<p><em>最重要的是:</em> 考虑一下我们在接触父-子关系之前讨论过的其他关系。</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="grandparents.html">« 祖辈与孙辈关系</a>
</span>
<span class="next">
<a href="scale.html">扩容设计 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>